/**
 * TAG获取Mac屏幕流虚拟音频权限，判断是否授权并检查是否安装了插件。
 *
 * @param {boolean} isScreen - 是否需要屏幕权限检查（是否授权屏幕录制）。
 *
 * @returns {'CAMERA_PERMISSION_NOT_GRANTED' | 'AUDIO_PERMISSION_NOT_GRANTED' | 'SCREEN_PERMISSION_NOT_GRANTED' | 'ALLOWED' | 'NOT_INSTALL_BLACKHOLE'} - 返回权限状态或者插件安装状态。
 *
 * @example
 * const permissionStatus = await getAudioRecordPermission(true);
 * console.log(permissionStatus); // 返回 'CAMERA_PERMISSION_NOT_GRANTED' 或 'ALLOWED' 等
 */
export async function getAudioRecordPermission(
    isScreen: boolean
): Promise<
    | 'CAMERA_PERMISSION_NOT_GRANTED'
    | 'AUDIO_PERMISSION_NOT_GRANTED'
    | 'SCREEN_PERMISSION_NOT_GRANTED'
    | 'ALLOWED'
    | 'NOT_INSTALL_BLACKHOLE'
> {
    if ((await getMacAudioRecordPermission('camera')) !== 'granted') {
        if (!(await requestMacAudioRecordPermission('camera'))) {
            return 'CAMERA_PERMISSION_NOT_GRANTED'; // 没授权
        }
    }
    if ((await getMacAudioRecordPermission('microphone')) !== 'granted') {
        if (!(await requestMacAudioRecordPermission('microphone'))) {
            return 'AUDIO_PERMISSION_NOT_GRANTED'; // 没授权
        }
    }
    if (isScreen) {
        console.log('getMacAudioRecordPermission', await getMacAudioRecordPermission('screen'));
        return 'SCREEN_PERMISSION_NOT_GRANTED'; // 没授权
    }
    return 'ALLOWED'; // 允许
}

/**
 * TAG检查用户电脑是否安装了SoundFlower或BlackHole插件。
 *
 * @returns {Promise<boolean>} - 返回一个布尔值，表示是否安装了插件。
 *
 * @example
 * const isInstalled = await getIfAlreadyInstallSoundFlowerOrBlackHole();
 * console.log(isInstalled); // 返回 true 或 false，表示是否安装了插件
 */
export async function getIfAlreadyInstallSoundFlowerOrBlackHole(): Promise<boolean> {
    const devices = await navigator.mediaDevices.enumerateDevices();
    console.log(
        'sound检查用户电脑是否有安装SoundFlower或者BlackHole',
        devices,
        devices.some(
            (device) =>
                device.label.includes('BlackHole 2ch (Virtual)') ||
                device.label.includes('Soundflower (2ch)')
        )
    );
    return devices.some(
        (device) =>
            device.label.includes('BlackHole 2ch (Virtual)') ||
            device.label.includes('Soundflower (2ch)')
    );
}

/**
 * TAG获取Mac设备的音频录制权限。
 *
 * @param {string} mediaType - 媒体类型，可以是 `microphone`、`camera` 或 `screen`。
 *
 * @returns {Promise<'not-determined' | 'granted' | 'denied' | 'restricted' | 'unknown'>} - 返回权限状态。
 *
 * @example
 * const permission = await getMacAudioRecordPermission('microphone');
 * console.log(permission); // 返回 'granted'、'denied' 等
 */
async function getMacAudioRecordPermission(
    mediaType: string
): Promise<'not-determined' | 'granted' | 'denied' | 'restricted' | 'unknown'> {
    console.log('获取权限', mediaType, await window.electronAPI.setCheckMicrophone(mediaType));
    return await window.electronAPI.setCheckMicrophone(mediaType);
}

/**
 * TAG请求Mac设备的音频录制权限。
 *
 * @param {string} mediaType - 媒体类型，请求的权限类型，可以是 `microphone` 或 `camera`。
 *
 * @returns {Promise<boolean>} - 返回是否成功授予权限。
 *
 * @example
 * const isPermissionGranted = await requestMacAudioRecordPermission('microphone');
 * console.log(isPermissionGranted); // 返回 true 或 false，表示是否成功授予权限
 */
async function requestMacAudioRecordPermission(mediaType: string): Promise<boolean> {
    console.log(
        '请求麦克风权限',
        mediaType,
        await window.electronAPI.askCheckMicrophone(mediaType)
    );
    return await window.electronAPI.askCheckMicrophone(mediaType);
}
